#include "stm32f10x.h"                  // Device header
#include "delay.h"
uint16_t LED_Cnt=0;
void PWM_Init(void)
{
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
	//配置gpio端口
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	
//	//用AFIO把pa0重映射到pa15
//	RCC_APB1PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
//	//根据参考手册里：表43 TIM2复用功能重映像
//	//选择部分重映射模式一，就可以把pa0重映射到pa15
//	//同时由于pa15初始并非普通的GPIO口，而是调试端口
//	//所以需要解除其调试模式
//	GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);
//	GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2,ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	//此处不能用标准推挽输出模式，因为该模式下，引脚的控制权来自于
	//输出数据寄存器
	//但我们想要用定时器TIM2通过CH1通道控制引脚，就需要更改为
	//复用推挽输出模式，此模式下，作为外设的定时器才能控制引脚
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	
	
	//设置时钟源为内部时钟（可以不写，因为定时器上电默认为内部时钟）
	TIM_InternalClockConfig(TIM2);
	
	//配置时基单元
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;	
	//配置外部滤波器的采样频率，与时基单元关系不大
	TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
	//向上计数模式
	TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;
	//实现计时的核心函数，参考计数器时序计算公式，根据想要定时的时长倒推两个参数
	//注意参数值要在0~65535之间，同时不要忘了减一
	TIM_TimeBaseInitStructure.TIM_Period=100-1;//自动重装器/周期ARR
	TIM_TimeBaseInitStructure.TIM_Prescaler=720-1;//预分频器PSC
	//高级计时器里才有的，这里不需要用，直接给0
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter=0;	
	TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);	
	
	//配置输出比较通道
	TIM_OCInitTypeDef TIM_OCInitStructure;
	//当有些结构体成员不需要赋初始值（这里是因为有些是高级定时器的功能）时
	//用这个函数给所有成员默认赋初始值（防止有些成员没有赋值导致未知bug）
	TIM_OCStructInit(&TIM_OCInitStructure);
	TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;//输出比较模式--pwm1
	TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;//输出比较极性--有效电平为高电平
	TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;//输出使能
	TIM_OCInitStructure.TIM_Pulse=0;//捕获/比较器CCR的值
	TIM_OC3Init(TIM2,&TIM_OCInitStructure);//选择TIM2的OC3通道输出pwm
	
	//要配置一个1kHZ,分辨率1%,占空比50%的pwm波形--根据需求用公式倒推需要的
	//psc,arr,ccr三个参数的值
	//启动定时器
	TIM_Cmd(TIM2,ENABLE);
}

void PWM_SetCompare3(uint8_t i)
{
	TIM_SetCompare3(TIM2,i);
}
void GPIO_Test(void)
{
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
    
    // 只解除JTAG，不重映射TIM2
    GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
    
    // 配置PA15为普通推挽输出
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    
    // 测试LED
    GPIO_SetBits(GPIOA, GPIO_Pin_15);  // 亮
    Delay_ms(1000);
    GPIO_ResetBits(GPIOA, GPIO_Pin_15); // 灭
    Delay_ms(1000);
    GPIO_SetBits(GPIOA, GPIO_Pin_15);  // 亮
}
void PWM_Init1(void)
{
    // 1. 开启时钟
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
    
    // 2. 先解除JTAG，再重映射TIM2
    GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
    Delay_ms(10);  // 稍作延时
    GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2, ENABLE);
    
    // 3. 配置PA15为复用推挽输出
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    
    // 4. 配置TIM2时基
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
    TIM_TimeBaseInitStructure.TIM_Period = 100 - 1;        // ARR
    TIM_TimeBaseInitStructure.TIM_Prescaler = 720 - 1;     // PSC  
    TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);
    
    // 5. 配置PWM输出
    TIM_OCInitTypeDef TIM_OCInitStructure;
    TIM_OCStructInit(&TIM_OCInitStructure);
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
    TIM_OCInitStructure.TIM_Pulse = 50;  // 初始50%占空比，便于观察
    TIM_OC1Init(TIM2, &TIM_OCInitStructure);
    
    // 6. 启动定时器
    TIM_Cmd(TIM2, ENABLE);
    
    // 7. 高级配置：使能预装载
    TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);
    TIM_ARRPreloadConfig(TIM2, ENABLE);
}
//void LED_Tick(void)
//{
//	LED_Cnt++;
//	if(LED_Cnt>10)
//	{
//		LED_Cnt=0;
//		switch(state)
//		{
//			case 0:
//				i++;
//				if(i>100)state=1;				
//				break;
//			case 1:
//				i--;
//				if(i==0)state=0;
//				break;
//		}
//	}
//}
